﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace Document_Management
{
    class Export_Excel
    {
        public void Export(DataTable dt, string sheetName, string title)
        {
            //Tạo các đối tượng Excel
            Microsoft.Office.Interop.Excel.Application oExcel = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbooks oBooks;
            Microsoft.Office.Interop.Excel.Sheets oSheets;
            Microsoft.Office.Interop.Excel.Workbook oBook;
            Microsoft.Office.Interop.Excel.Worksheet oSheet;
            //Thiết lập vùng điền dữ liệu
            int rowStart = 4;
            int columnStart = 1;
            int rowEnd = rowStart + dt.Rows.Count - 1;
            int columnEnd = dt.Columns.Count;
            //Tạo mới một Excel WorkBook 
            oExcel.Visible = true;
            oExcel.DisplayAlerts = false;
            oExcel.Application.SheetsInNewWorkbook = 1;
            oBooks = oExcel.Workbooks;
            oBook = (Microsoft.Office.Interop.Excel.Workbook)(oExcel.Workbooks.Add(Type.Missing));
            oSheets = oBook.Worksheets;
            oSheet = (Microsoft.Office.Interop.Excel.Worksheet)oSheets.get_Item(1);
            oSheet.Name = sheetName;
            // Tạo phần đầu nếu muốn
            Microsoft.Office.Interop.Excel.Range t1 = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[1, columnStart];
            // Ô kết thúc điền dữ liệu
            Microsoft.Office.Interop.Excel.Range t2 = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[1, columnEnd+1];
            // Lấy về vùng điền dữ liệu
            Microsoft.Office.Interop.Excel.Range head = oSheet.get_Range(t1, t2);
            //
            head.MergeCells = true;
            head.Value2 = title;
            head.Font.Bold = true;
            head.Font.Name = "Tahoma";
            head.Font.Size = "18";
            head.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
            // Ô bắt đầu điền header
            Microsoft.Office.Interop.Excel.Range stt = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[rowStart - 1, columnStart];
            stt.Value2 = "項次";
            stt.Font.Bold = true;
            // Kẻ viền
            stt.Borders.LineStyle = Microsoft.Office.Interop.Excel.Constants.xlSolid;
            // Thiết lập màu nền
            stt.Interior.ColorIndex = 15;
            stt.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
            //
            Microsoft.Office.Interop.Excel.Range h1 = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[rowStart - 1, columnStart + 1];
            // Ô kết thúc điền header
            Microsoft.Office.Interop.Excel.Range h2 = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[rowStart - 1, columnEnd + 1];
            // Lấy về vùng điền header
            Microsoft.Office.Interop.Excel.Range range1 = oSheet.get_Range(h1, h2);
            object[] header = new object[dt.Columns.Count];
            for (int c = 0; c < dt.Columns.Count; c++)
            {
                header[c] = dt.Columns[c].ColumnName;
            }
            range1.Value2 = header;

            //Microsoft.Office.Interop.Excel.Range rowHead = oSheet.get_Range("A3", "R3");
            range1.Font.Bold = true;
            // Kẻ viền
            range1.Borders.LineStyle = Microsoft.Office.Interop.Excel.Constants.xlSolid;
            // Thiết lập màu nền
            range1.Interior.ColorIndex = 15;
            range1.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
            // Tạo mẳng đối tượng để lưu dữ toàn bồ dữ liệu trong DataTable,
            // vì dữ liệu được được gán vào các Cell trong Excel phải thông qua object thuần.
            object[,] arr = new object[dt.Rows.Count, dt.Columns.Count];
            int[] st = new int[dt.Rows.Count];
            //Chuyển dữ liệu từ DataTable vào mảng đối tượng
            for (int r = 0; r < dt.Rows.Count; r++)
            {
                Microsoft.Office.Interop.Excel.Range stt1 = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[r + rowStart, columnStart];
                stt1.Borders.LineStyle = Microsoft.Office.Interop.Excel.Constants.xlSolid;
                stt1.Value2 = r + 1;
                DataRow dr = dt.Rows[r];
                for (int c = 0; c < dt.Columns.Count; c++)
                {
                    arr[r, c] = dr[c];
                }
            }
            // Ô bắt đầu điền dữ liệu
            Microsoft.Office.Interop.Excel.Range c1 = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[rowStart, columnStart + 1];
            // Ô kết thúc điền dữ liệu
            Microsoft.Office.Interop.Excel.Range c2 = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[rowEnd, columnEnd + 1];
            // Lấy về vùng điền dữ liệu
            Microsoft.Office.Interop.Excel.Range range = oSheet.get_Range(c1, c2);
            //Điền dữ liệu vào vùng đã thiết lập
            range.Value2 = arr;
            // Kẻ viền
            range.Borders.LineStyle = Microsoft.Office.Interop.Excel.Constants.xlSolid;
            // Căn giữa cột STT
            Microsoft.Office.Interop.Excel.Range c4 = (Microsoft.Office.Interop.Excel.Range)oSheet.Cells[rowEnd, columnStart];
            Microsoft.Office.Interop.Excel.Range c3 = oSheet.get_Range(c1, c4);
            oSheet.get_Range(c3, c4).HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
        }
    }
}
